package com.aaa.vegetablemarketexpress.service.impl;

import com.aaa.vegetablemarketexpress.dao.ColdDao;
import com.aaa.vegetablemarketexpress.entity.Cold;
import com.aaa.vegetablemarketexpress.entity.User;
import com.aaa.vegetablemarketexpress.service.ColdService;
import com.aaa.vegetablemarketexpress.util.CustomException;
import com.aaa.vegetablemarketexpress.util.ResultStatus;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.util.Date;
import java.util.List;

/**
 * @FileName: ColdServiceImpl
 * @Description: 冷藏方式服务实现类
 * @Author:
 * @CreateTime: 2025/9/9
 * @Version: 1.0.0
 */
@Service
public class ColdServiceImpl implements ColdService {

    @Resource
    private HttpSession session;

    @Resource
    private ColdDao coldDao;

    /**
     * 根据ID查询冷藏方式
     * @param coldId
     * @return
     */
    @Override
    public Cold selectColdById(Long coldId) {
        return coldDao.selectColdById(coldId);
    }

    /**
     * 查询冷藏方式列表
     * @param cold
     * @return
     */
    @Override
    public List<Cold> selectColdList(Cold cold) {
        return coldDao.selectColdList(cold);
    }

    /**
     * 插入冷藏方式
     * @param cold
     * @return
     */
    @Override
    public int insertCold(Cold cold) {
//        grade.setCreateTime(new Date());
//        grade.setDelFlag("0");
        cold.setCreateTime(new Date());
        cold.setDelFlag("0");

        // 检查冷藏方式名称是否唯一
        if (!"0".equals(checkColdNameUnique(cold))) {
            throw new CustomException(ResultStatus.FAILED.getStatusCode(), "冷藏方式名称已存在");
        }
        cold.setCreateBy(((User)(session.getAttribute("userInfo"))).getUserName());
        cold.setCreateTime(new Date());
        return coldDao.insertCold(cold);
    }

    /**
     * 更新冷藏方式
     * @param cold
     * @return
     */
    @Override
    public int updateCold(Cold cold) {
        cold.setUpdateTime(new Date());
        // 检查冷藏方式名称是否唯一
        if (!"0".equals(checkColdNameUnique(cold))) {
            throw new CustomException(ResultStatus.FAILED.getStatusCode(), "冷藏方式名称已存在");
        }
        cold.setUpdateBy(((User)(session.getAttribute("userInfo"))).getUserName());
        cold.setUpdateTime(new Date());
        return coldDao.updateCold(cold);
    }

    /**
     * 删除冷藏方式
     * @param coldId
     * @return
     */
    @Override
    public int deleteColdById(Long coldId) {
        // 检查冷藏方式是否被使用
        if (coldDao.checkColdUse(coldId) > 0) {
            throw new CustomException(ResultStatus.FAILED.getStatusCode(), "冷藏方式已被使用，不能删除");
        }
        return coldDao.deleteColdById(coldId);
    }

    /**
     * 批量删除冷藏方式
     * @param coldIds
     * @return
     */
    @Override
    public int deleteColdByIds(Long[] coldIds) {
        for (Long coldId : coldIds) {
            // 检查冷藏方式是否被使用
            if (coldDao.checkColdUse(coldId) > 0) {
                throw new CustomException(ResultStatus.FAILED.getStatusCode(),
                        "冷藏方式ID " + coldId + " 已被使用，不能删除");
            }
        }
        return coldDao.deleteColdByIds(coldIds);
    }

    /**
     * 检查冷藏方式名称是否唯一
     * @param cold
     * @return
     */
    @Override
    public String checkColdNameUnique(Cold cold) {
        Cold info = coldDao.selectColdByName(cold.getColdName());
        if (info != null && !info.getColdId().equals(cold.getColdId())) {
            return "1"; // 已存在
        }
        return "0"; // 不存在
    }

    /**
     * 更新冷藏方式状态
     * @param coldId
     * @param status
     * @return
     */
    @Override
    @Transactional
    public int updateColdStatus(Long coldId, String status) {
        return coldDao.updateColdStatus(coldId, status);
    }

    /**
     * 查询所有正常冷藏方式
     * @return
     */
    @Override
    public List<Cold> selectAllNormalCold() {
        return coldDao.selectAllNormalCold();
    }

    /**
     * 查询冷藏方式总数
     * @param cold
     * @return
     */
    @Override
    public int countCold(Cold cold) {
        return coldDao.countCold(cold);
    }
}
